Code sample Home

Making custom commands by using function lcWndWaitPoint


// Let user to pick 2 points on a window to create a Circle entity
//-----------------------------------------------
void DemoWaitPoint1 (HANDLE hLcWnd)
{
  double X1, Y1, X2, Y2, Rad;
  HANDLE hBlock;

  // get a block, linked with CAD window
  hBlock = lcPropGetHandle( hLcWnd, LC_PROP_WND_BLOCK );
  for (;;){
    lcPropPutInt( hLcWnd, LC_PROP_WND_INT0, 102 );
    lcPropPutInt( hLcWnd, LC_PROP_WND_INT1, 1 );
    if (lcWndWaitPoint( hLcWnd, L"Center", &X1, &Y1 )){
      lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT0, X1 );
      lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT1, Y1 );
      lcPropPutInt( hLcWnd, LC_PROP_WND_INT1, 2 );
      if (lcWndWaitPoint( hLcWnd, L"Radius", &X2, &Y2 )){
        Rad = _hypot( X2-X1, Y2-Y1 );
        lcBlockAddCircle( hBlock, X1, Y1, Rad, false );
        lcWndRedraw( hLcWnd );
      }else{
        break;  // exit cycle
      }
    }else{
      break;  // exit cycle
    }
  }
}

// Let user to pick 2 points on a window to create a Line entity
//-----------------------------------------------
void DemoWaitPoint2 (HANDLE hLcWnd)
{
  double X1, Y1, X2, Y2;
  HANDLE hBlock;

  // get a block, linked with CAD window
  hBlock = lcPropGetHandle( hLcWnd, LC_PROP_WND_BLOCK );
  for (;;){
    lcPropPutInt( hLcWnd, LC_PROP_WND_INT0, 101 );
    lcPropPutInt( hLcWnd, LC_PROP_WND_INT1, 1 );
    if (lcWndWaitPoint( hLcWnd, L"Pick first point", &X1, &Y1 )){
      lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT0, X1 );
      lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT1, Y1 );
      lcPropPutInt( hLcWnd, LC_PROP_WND_INT1, 2 );
      if (lcWndWaitPoint( hLcWnd, L"Pick second point", &X2, &Y2 )){
        lcBlockAddLine( hBlock, X1, Y1, X2, Y2 );
        lcWndRedraw( hLcWnd );
      }else{
        break;  // exit cycle
      }
    }else{
      break;  // exit cycle
    }
  }
}

//-----------------------------------------------
void CALLBACK EventProc (HANDLE hEvent)
{
  int EventType;
  HANDLE hLcWnd;
  LcApplication* pApp = (LcApplication*)lcPropGetHandle( hEvent, LC_PROP_EVENT_APPPRM2 );
  if (pApp){
    EventType = lcPropGetInt( hEvent, LC_PROP_EVENT_TYPE );
    switch( EventType ){
      ...
      case LC_EVENT_WAITPOINT:  pApp->OnWaitPoint( hEvent ); break;
      ...
    }
  }
}

//-----------------------------------------------
bool LcApplication::Init (HINSTANCE hInst, LPCWSTR szAppDir)
{
  ...
  lcEventSetProc( LC_EVENT_WAITPOINT, EventProc, 0, (HANDLE)this );
  ...
  bInit = lcInitialize();
  ...
}

//-----------------------------------------------
void LcApplication::OnWaitPoint (HANDLE hEvent)
{
  WCHAR  szText[256];
  HANDLE hLcWnd, hPtbuf;
  double x0, y0, x1, y1, Rad;
  int    Cmd, Step;

  hLcWnd = lcPropGetHandle( hEvent, LC_PROP_EVENT_WND );
  Cmd  = lcPropGetInt( hLcWnd, LC_PROP_WND_INT0 );
  Step = lcPropGetInt( hLcWnd, LC_PROP_WND_INT1 );
  if (Cmd == 101){
    if (Step == 2){
      x0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT0 );
      y0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT1 );
      x1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURX );
      y1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURY );
      lcPaint_DrawLine( hLcWnd, x0, y0, x1, y1 );
    }
  }else
  if (Cmd == 102){
    x1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURX );
    y1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURY );
    if (Step == 1){
      swprintf( szText, L"Center point %.2f, %.2f", x1, y1 );
      lcCmdCursorText( hLcWnd, szText );
    }else
    if (Step == 2){
      x0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT0 );
      y0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT1 );
      lcPaint_DrawLine( hLcWnd, x0, y0, x1, y1 );
      Rad = _hypot( x1-x0, y1-y0 );
      hPtbuf = lcPaint_CreatePtbuf();
      lcPaint_PtbufAddCircle( hPtbuf, x0, y0, Rad, 128 );
      lcPaint_DrawPtbuf( hLcWnd, hPtbuf, true );
      lcPaint_DeletePtbuf( hPtbuf );
      swprintf( szText, L"Radius %.2f", Rad );
      lcCmdCursorText( hLcWnd, szText );
    }
  }
}